package com.mt.roll.wms.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mt.roll.core.api.Assert;
import com.mt.roll.core.base.BaseService;
import com.mt.roll.core.dal.entity.MaterialAttr;
import com.mt.roll.core.dal.service.MaterialAttrServiceBiz;
import com.mt.roll.core.enums.WhetherEnum;
import com.mt.roll.core.params.EnabledParam;
import com.mt.roll.core.params.IdListParam;
import com.mt.roll.core.params.IdParam;
import com.mt.roll.core.vo.IdListVo;
import com.mt.roll.core.vo.IdVo;
import com.mt.roll.core.vo.PageVo;
import com.mt.roll.core.vo.R;
import com.mt.roll.core.base.BaseService;
import com.mt.roll.core.dal.service.MaterialAttrServiceBiz;
import com.mt.roll.core.params.IdParam;
import com.mt.roll.wms.constants.CodeConstant;
import com.mt.roll.wms.params.MaterialAttrParam;
import com.mt.roll.wms.params.MaterialAttrQueryParam;
import com.mt.roll.wms.service.MaterialAttrService;
import com.mt.roll.wms.utils.CodeUtil;
import com.mt.roll.wms.vo.MaterialAttrVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @Author weihongyang
 * @Date 2020/12/30 16:03
 * @Version 1.0
 */
@Service
@Transactional
public class MaterialAttrServiceImpl extends BaseService implements MaterialAttrService {
    @Autowired
    private MaterialAttrServiceBiz materialAttrServiceBiz;


    /**
     * 获取xx
     *
     * @param idParam 主键参数
     * @return xx
     */
    @Override
    public R<MaterialAttrVo> get(IdParam idParam) {
        MaterialAttr materialAttr = materialAttrServiceBiz.getById(idParam.getId());
        Assert.notNull("物料属性不存在", materialAttr);
        MaterialAttrVo materialAttrVo = MaterialAttrVo.builder().build();
        BeanUtils.copyProperties(materialAttr, materialAttrVo);
        return successful(materialAttrVo);
    }

    /**
     * 获取xx列表
     *
     * @param materialAttrQueryParam xx查询参数
     * @return xx列表
     */
    @Override
    public R<List<MaterialAttrVo>> list(MaterialAttrQueryParam materialAttrQueryParam) {
        return null;
    }

    /**
     * 获取xx分页列表
     *
     * @param materialAttrQueryParam xx查询参数
     * @return xx分页列表
     */
    @Override
    public R<PageVo<MaterialAttrVo>> page(MaterialAttrQueryParam materialAttrQueryParam) {
        QueryWrapper<MaterialAttr> wrapper = new QueryWrapper<>();
        wrapper.eq(ObjectUtils.isNotNull(materialAttrQueryParam.getMaterialId()), MaterialAttr.MATERIAL_ID, materialAttrQueryParam.getMaterialId())
        .orderByDesc(MaterialAttr.CREATE_TIME);
        IPage<MaterialAttr> page = materialAttrServiceBiz.page(new Page<>(materialAttrQueryParam.getCurrent(), materialAttrQueryParam.getSize()), wrapper);
        return successful(new PageVo<>(page, MaterialAttrVo.class));
    }

    /**
     * 获取xx树列表
     *
     * @param materialAttrQueryParam xx查询参数
     * @return xx树列表
     */
    @Override
    public R<List<MaterialAttrVo>> tree(MaterialAttrQueryParam materialAttrQueryParam) {
        return null;
    }

    /**
     * 新增xx
     *
     * @param materialAttrParam xx参数
     * @return 主键
     */
    @Override
    public R<IdVo> add(MaterialAttrParam materialAttrParam) {
        MaterialAttr materialAttr = new MaterialAttr();
        BeanUtils.copyProperties(materialAttrParam, materialAttr);
        setCommonField(materialAttr);
        materialAttrServiceBiz.save(materialAttr);
        return successful(IdVo.builder().id(materialAttr.getId()).build());
    }

    /**
     * 更新xx
     *
     * @param materialAttrParam xx参数
     * @return 主键
     */
    @Override
    public R<IdVo> update(MaterialAttrParam materialAttrParam) {
        MaterialAttr materialAttr = materialAttrServiceBiz.getById(materialAttrParam.getId());
        MaterialAttr updateMaterialAttr = new MaterialAttr();
        BeanUtils.copyProperties(materialAttrParam, updateMaterialAttr);
        setUpdateCommonField(updateMaterialAttr);
        materialAttrServiceBiz.updateById(updateMaterialAttr);
        return successful(IdVo.builder().id(materialAttr.getId()).build());
    }

    /**
     * 启用停用
     *
     * @param enabledParam 启停参数
     * @return 主键
     */
    @Override
    public R<IdVo> enabled(EnabledParam enabledParam) {
        return null;
    }

    /**
     * 删除xx
     *
     * @param idParam 主键参数
     * @return 主键
     */
    @Override
    public R<IdVo> delete(IdParam idParam) {
        MaterialAttr materialAttr= materialAttrServiceBiz.getById(idParam.getId());
        if (materialAttr == null) {
            return failed("物料属性不存在");
        }
        //使用更新方式删除，需要把code设置为历史code（后面跟随机数）
        MaterialAttr updateMaterialAttr = new MaterialAttr().setId(materialAttr.getId());
        updateMaterialAttr.setValid(WhetherEnum.NO.getValue());
        setUpdateCommonField(updateMaterialAttr);
        materialAttrServiceBiz.updateById(updateMaterialAttr);
        //更新时逻辑删除字段没有更新，需要再调用一次删除操作
        materialAttrServiceBiz.removeById(updateMaterialAttr.getId());
        return successful(IdVo.builder().id(materialAttr.getId()).build());
    }

    /**
     * 批量删除xx
     *
     * @param idListParam 主键列表参数
     * @return 主键列表
     */
    @Override
    public R<IdListVo> delete(IdListParam idListParam) {
        return null;
    }

    @Override
    public R<String> getCode() {
        return successful(CodeUtil.getCode(CodeConstant.FACTORY_CODE));
    }
}
